package com.example.multithreading.threadbase;

import java.io.IOException;

/**
 * 守护线程与普通线程的唯一区别是：当JVM中所有的线程都是守护线程的时候，JVM就可以退出了；
 * 如果还有一个或以上的非守护线程则不会退出。（以上是针对正常退出，调用System.exit则必定会退出）
 * 用户线程：Java虚拟机在它所有非守护线程已经离开后自动离开。
 * 守护线程：守护线程则是用来服务用户线程的，如果没有其他用户线程在运行，那么就没有可服务对象，也就没有理由继续下去。
 * setDaemon(boolean on)方法可以方便的设置线程的Daemon模式，true为Daemon模式，false为User模式。setDaemon(boolean on)方法必须在线程启动之前调用，当线程正在运行时调用会产生异常。
 * isDaemon方法将测试该线程是否为守护线程。值得一提的是，当你在一个守护线程中产生了其他线程，那么这些新产生的线程不用设置Daemon属性，都将是守护线程，用户线程同样。
 *
 * @author xiaohongfei
 * @createTime 2023/7/10 13:43
**/

public class DaemonThread extends  Thread{

        public DaemonThread() {

        }

        public void run() {
            for (int i = 0 ; i < 100 ; i ++) {
                try {
                    Thread.sleep(100) ;
                } catch (InterruptedException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
                System.out.println(i);
            }
        }

        public static void main (String args[]) {
            DaemonThread test = new DaemonThread() ;
            test.setDaemon(true) ;
            test.start() ;
            System.out.println("isDaemon=" + test.isDaemon());

            //等待客户端输入，main线程未结束，则会输出DaemonThread中打印的内容
            //如果这里直接结束main方法（注释下方代码），则DaemonThread中不会输出任何内容
            try {
                System.in.read() ;
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }

}
